/*
 *  ckr_spec_StringUtils.h.cpp
 *  ckrSpec
 *
 *  Created by C. Keith Ray on 2006.11.21.
 *  Copyright 2006 __MyCompanyName__. All rights reserved.
 *
 */

#include "ckr_spec_StringUtils.h"
#include <sstream>

using namespace std;

namespace  ckr
{

//  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

std::string padWithSpaces( const std::string& strIn, int width )
{
	return padWithChar( strIn, width, ' ' );
}

//  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

std::string padWithChar( const std::string& strIn, int width, char c )
{
	std::string result( strIn );
	if ( strIn.length() < width )
	{
		result.append( width - strIn.length(), c );
	}
	return result;
}

//  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

std::string failString( bool failed )
{
	return ( failed ? "FAIL" : "pass" );
}

//  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

std::string runString( bool hasRun )
{
	return ( hasRun ? "yes" : "no" );
}

//  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

std::string durationString( double dur )
{
	std::stringstream strm;
	strm << dur;
	return strm.str();
}

//  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

CmdTokenizer::CmdTokenizer( const std::string& strIn )
	: currentIndex( 0 )
	, done( false )
	, myString( strIn )
{
};

//  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

CmdTokenizer::~CmdTokenizer()
{
}

//  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

StringList CmdTokenizer::tokenizeCmdString()
{
	StringList result;
	skipSpaces();
	
	while ( not done )
	{
		std::string str = nextToken();

		if ( str != "" )
		{
			result.push_back( str );
		}
		skipSpaces();
	}

	return result;
}

//  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

std::string CmdTokenizer::nextToken()
{
	std::string result;
	
	if ( currentIndex == myString.length() )
	{
		done = true;
	}
	else 
	{
		if ( ispunct( myString.at(currentIndex) ) )
		{
			result = nextPunct();
		}
		else if ( myString.at(currentIndex) == '_' or 
					isalnum( myString.at(currentIndex) ) )
		{
			result = nextWord();
		}
	}
	return result;
}

//  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

std::string CmdTokenizer::nextWord()
{
	std::string result;
	while ( currentIndex < myString.length() and 
				( myString.at(currentIndex) == '_' or 
					isalnum( myString.at(currentIndex) ) ) )
	{
		result += myString.at(currentIndex);
		currentIndex++;
	}
	return result;
}

//  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

std::string CmdTokenizer::nextPunct()
{
	std::string result;
	while ( currentIndex < myString.length() and 
			ispunct( myString.at(currentIndex) ) )
	{
		result += myString.at(currentIndex);
		currentIndex++;
	}
	return result;
}

//  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

void CmdTokenizer::skipSpaces()
{
	while ( currentIndex < myString.length() and 
				isblank( myString.at(currentIndex) ) )
	{
		currentIndex++;
	}
}

//  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

std::string toUpper( const std::string& strIn )
{
	std::string result = strIn;
	for ( int i = 0; i < result.length(); i++ )
	{
		result[i] = toupper( result[i] );
	}
	return result;
}

//  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

}; // namespace

